﻿using System.Collections.Generic;
using Wedn.Core.Entity;

namespace Wedn.Interface.DAL
{
    /// <summary>
    /// 用户表操作类接口
    /// </summary>
    public interface IUser
    {
        #region 插入记录
        /// <summary>
        /// 像用户信息表插入一行数据, 返回执行结果受影响行数
        /// </summary>
        /// <param name="user">要添加的用户对象</param>
        /// <returns>执行结果受影响行数</returns>
        int Insert(User user);
        #endregion

        #region 删除记录

        #region 删除一条
        /// <summary>
        /// 根据用户ID删除用户表中的用户记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">要删除的用户ID</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(int id);
        #endregion

        #region 删除多条
        /// <summary>
        /// 根据用户ID数组删除用户表中的用户记录, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">要删除的用户ID数组</param>
        /// <returns>执行结果受影响行数</returns>
        int Delete(int[] ids);
        #endregion

        #endregion

        #region 更新记录

        #region 更新完整对象
        /// <summary>
        /// 更新一个完整用户对象, 返回执行结果受影响行数
        /// </summary>
        /// <param name="user">更新的用户对象</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateUser(User user);
        #endregion

        #region 更新字段

        /// <summary>
        /// 更新用户的个人信息, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">用户ID</param>
        /// <param name="nickname">更新的昵称(不更新则传入null)</param>
        /// <param name="email">更新的Email(不更新则传入null)</param>
        /// <param name="url">更新的网址(不更新则传入null)</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateInfo(int id, string nickname, string email, string url);

        /// <summary>
        /// 更新用户密码, 返回执行结果受影响行数
        /// </summary>
        /// <param name="id">用户ID</param>
        /// <param name="password">更新的密码</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdatePassword(int id, string password);

        /// <summary>
        /// 批量更新用户状态, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">用户ID</param>
        /// <param name="status">更新的权限(0:正常, 1:待验证审核)</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateStatus(int[] ids, int status);

        /// <summary>
        /// 批量更新用户角色, 返回执行结果受影响行数
        /// </summary>
        /// <param name="ids">用户ID</param>
        /// <param name="role">更新的角色(0:管理员,1:撰写人,2:订阅者)</param>
        /// <returns>执行结果受影响行数</returns>
        int UpdateRole(int[] ids, int role);

        #endregion

        #endregion

        #region 选取用户

        #region 常用方法

        #region 选取表中主键最大值
        /// <summary>
        /// 获取表中主键最大值, 返回主键最大值
        /// </summary>
        /// <returns>主键最大值</returns>
        int SelectMaxId();
        #endregion

        #region 检查用户名是否存在
        /// <summary>
        /// 判断用户名是否存在,如果存在则返回TRUE,否则返回FALSE
        /// </summary>
        /// <param name="userName">要判断的用户名</param>
        /// <returns>存在则返回TRUE,否则返回FALSE</returns>
        bool Exists(string userName);
        #endregion

        #endregion

        #region 选取用户总数
        /// <summary>
        /// 选取用户总数
        /// </summary>
        /// <param name="where">条件</param>
        /// <returns>总数</returns>
        int SelectUsersCount(string where);
        #endregion

        #region 选取所有用户信息
        /// <summary>
        /// 选取用户信息表中所有用户信息, 返回对象集合, 如果不存在则返回null
        /// </summary>
        /// <returns>所有用户信息集合</returns>
        List<User> SelectUserList();
        #endregion

        #region 根据各种检索条件选取用户信息表中所有用户信息
        /// <summary>
        /// 根据各种检索条件选取用户信息表中所有用户信息, 返回用户对象集合, 如果不存在则返回null
        /// </summary>
        /// <param name="keyword">关键字(忽略该条件则传入null)</param>
        /// <param name="status">状态(忽略该条件则传入-1)</param>
        /// <param name="role">角色(忽略该条件则传入-1)</param>
        /// <param name="pageSize">文章数目</param>
        /// <param name="pageIndex">页码</param>
        /// <param name="orderField">排序字段</param>
        /// <param name="order">排序方式(0:降序(desc)|1:升序(asc))</param>
        /// <param name="recordCount">返回查询到的记录数</param>
        /// <returns>所有满足条件的用户信息集合</returns>
        List<User> SelectUserList(string keyword, int status, int role, int pageSize, int pageIndex, string orderField, int order, out int recordCount);
        #endregion

        #region 根据用户ID获取所有用户对象
        /// <summary>
        /// 根据用户ID获取用户信息表中用户信息对象, 返回用户信息对象, 如果不存在则返回null
        /// </summary>
        /// <param name="id">用户ID</param>
        /// <returns>用户信息对象, 不存在则返回NULL</returns>
        User SelectUser(int id);
        #endregion

        #region 根据用户登录名获取所有用户对象
        /// <summary>
        /// 根据用户ID获取用户信息表中用户信息对象, 返回用户信息对象, 如果不存在则返回null
        /// </summary>
        /// <param name="login">用户登录名</param>
        /// <returns>用户信息对象, 不存在则返回NULL</returns>
        User SelectUser(string login);
        #endregion

        #endregion
    }
}
